package com.gxa.springboot229.controller;

import com.gxa.springboot229.excption.BusinessException;
import com.gxa.springboot229.pojo.Ticket;
import com.gxa.springboot229.service.TicketService;
import com.gxa.springboot229.util.JsonResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("img")
public class UploadController {
    @Resource
    private TicketService ticketService;
    private Ticket ticket = new Ticket();

    /**
     * 图片上传
     * @param id
     * @param multipartFile
     * @param request
     * @return
     */
    @ResponseBody
    @PostMapping(value = "/upload")
    public Map upload(@RequestParam("id") int id,@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request){
        //判断文件不为空
        if(multipartFile.isEmpty()){
            throw  new BusinessException("空文件不能上传");
        }
        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("originalFilename:"+originalFilename);
        //判断文件大小（不能超过1M），格式后缀（png/jpg/jpeg/gif） file.length()字节数 file.getSize()文件字节大小


        // file.getName()  subString(lastindexOf(".")+1) 找到文件后缀（重右到左数第一个点）
        String subfix = null;
        try{
            subfix = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
        }catch (NullPointerException e){
            new BusinessException(e);
        }

        System.out.println("图片后缀:"+subfix); //输出文件后缀

        if(multipartFile.getSize()>= 1024*1024){
            System.out.println("文件太大了");
            throw  new BusinessException("图片太大了");
        }

        //返回给前端上传成功的消息
        String newFileName;
        if("jpg".equals(subfix) ||"png".equals(subfix)||"gif".equals(subfix)){

            //使用UUID作为文件名,保证服务器中存放的文件名唯一     通过uuid生成文件名+原来的后缀 =》 组成新的文件名
            String targetFile = UUID.randomUUID().toString().replace("-","")+"."+subfix;
            System.out.println("targetFile:"+targetFile); //输出目标文件名

            // 通过request获取当前程序的根路径"/"
            String path = "/usr/java/upload/img/";
            String fileName = path+targetFile;
//            String path = request.getServletContext().getRealPath("/");
//            String fileName = path+"uploadImg/"+targetFile;

            System.out.println("fileName:"+fileName);  //输出文件完整地址

            // 构建文件对象
            File uploadFile = new File(fileName);
            //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
            // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
            // 出现异常则设定其他
            // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
            try {
                multipartFile.transferTo(uploadFile);
                ticket.setId(id);
                ticket.setImg(fileName);
                int uploadyi = ticketService.addTicket(ticket);
                if(uploadyi == 1){
                    newFileName = fileName;
                }else {
                    newFileName = "图片上传失败";
                }
            } catch (IOException e) {
                //e.printStackTrace();
                throw new BusinessException(e);
            }

        } else {
            throw  new BusinessException("图片格式错误!");
        }


        //在springboot 项目中，如何 把上传的文件保存在指定的位置
        // 目标路径：/img/fileName
        //真实路径：/usr/update/


        //返回给前端
        JsonResult jsonResult = new JsonResult();
        jsonResult.put("file",newFileName);
        jsonResult.setCode("1");
        return jsonResult.getValues();
    }
}
